﻿// js -> java 发送 json{tsId:"asd",androidObject:1000,parameter{}}
// java -> js 返回 json{tsId:"asd",parameter:{},isOff:true};
namespace DataFramework {

    //调用android方法管理器
    export class MessageMgr {
        id_counter: number = 0;
        messageContentArray: { [id: string]: MessageContent };
        constructor() {
            this.messageContentArray = {};
        }

        /**
         * 设置需要调用的方法和参数
         * @param andriodObject 方法
         * @param parameter 参数
         * @param callBack 回调
         */
        callAndroid(andriodObject: AndriodObject, parameter: any, callBack: (json: any) => void = null): string {
            let messageContent = new MessageContent();
            messageContent.tsId = "TsId" + this.id_counter;
            messageContent.androidObject = andriodObject;
            messageContent.call_back = callBack;
            messageContent.parameter = parameter;
            this.messageContentArray[messageContent.tsId] = messageContent;
            this.id_counter++;
            return messageContent.tsId;
        }

        /**
         * 开始调用
         * @param id 分配的id
         */
        call(id: string): string {
            let json = JSON.stringify(this.messageContentArray[id]);
            return windows.jstojava.drive(json);
        }

        /**
         * android数据
         * @param json 数据
         */
        messageReturn(json: string) {
            let content = JSON.parse(json) as { tsId: string, parameter: any ,isOff: boolean };
            this.messageContentArray[content.tsId].call_back(content.parameter);
            if (content.isOff) {
                delete this.messageContentArray[content.tsId];
            }
        }

        /**
         * 释放方法
         * @param id 需要释放的方法的id
         */
        callOff(id: string) {
            delete this.messageContentArray[id];
        }

    }

    // Android 方法
    export enum AndriodObject {
        SOCKET = 1000,
        HTTP = 1001,
        LOG_SHOW = 2000,
        LOG_TOAST = 2001,
    }

    // 调用参数
    export class MessageContent {
        tsId: string;
        androidObject: AndriodObject;
        call_back: (json: string) => void;
        parameter: any;
    }

}